package cn.com.main;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PasswordValidator {

    public static boolean validatePassword(String password) {
        // 密码长度应在8到32之间
        if (password.length() < 8 || password.length() > 32) {
            return false;
        }

        // 至少包含三种字符中的一种：大写字母、小写字母、数字和特殊字符!@#%^*?
        Pattern upperCasePattern = Pattern.compile("[A-Z]");
        Pattern lowerCasePattern = Pattern.compile("[a-z]");
        Pattern digitPattern = Pattern.compile("[0-9]");
        Pattern specialCharPattern = Pattern.compile("[~|!|@|#|%|^|*|-|_|=|+|?]+");

        int characterTypesCount = 0;
        if (upperCasePattern.matcher(password).find()) {
            characterTypesCount++;
        }
        if (lowerCasePattern.matcher(password).find()) {
            characterTypesCount++;
        }
        if (digitPattern.matcher(password).find()) {
            characterTypesCount++;
        }
        // 将大写字母、小写字母、数字替换为空
        String replacedPassword = password.replaceAll("[A-Za-z0-9]", "");
        if (specialCharPattern.matcher(replacedPassword).find()) {
            characterTypesCount++;
            // 检查替换后的字符串是否只有 "!@#%^*?" 中的一个
            if (!specialCharPattern.matcher(replacedPassword).find()) {
                return false;
            }
        }
        // 检查替换后的字符串是否只有 "!@#%^*?" 中的一个
        if (!specialCharPattern.matcher(replacedPassword).matches()) {
            return false;
        }

        // 至少包含三种字符中的一种
        if (characterTypesCount < 3) {
            return false;
        }


        return true;
    }

    public static List<String> getTestCases() {
        List<String> testCases = new ArrayList<>();

        // 有效密码
        testCases.add("Password123!");

        // 密码长度小于8个字符
        testCases.add("Pass12!");

        // 密码长度大于32个字符
        testCases.add("ThisIsALongPasswordThatIsDefinitelyMoreThan32Characters!");

        // 密码只包含大写字母和数字
        testCases.add("PASSWORD123");

        // 密码只包含小写字母和特殊字符
        testCases.add("password!@#");

        // 密码只包含数字和特殊字符，但特殊字符不在 "!@#%^*?" 中
        testCases.add("123&$%");

        // 密码包含三种不同类型的字符，但有多个特殊字符
        testCases.add("Pa~~w0rd!@#123");

        // 密码包含三种不同类型的字符，且特殊字符只有一个且是 "!@#%^*?" 中的一个
        testCases.add("Password1!$");
        testCases.add("123abcdA$");
        testCases.add("123abcdA>>");
        testCases.add("123abcdA.");
        testCases.add("123abcdA。");
        testCases.add("123abcdA，");
        testCases.add("123abcdA》");
        testCases.add("123abcdA//");
        testCases.add("!Q2w3e4r>/,,,......)(&$");

        //testCases.add("Pa~~w0rd!@#123");


        return testCases;
    }

    public static void main(String[] args) {

        List<String> testCases = getTestCases();
        for (String password : testCases) {
            Matcher matcher = Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[~|!|@|#|%|^|*|-|_|=|+|?A-Za-z\\d]{8,32}$").matcher(password);
            System.out.println("密码: " + password + ", 验证结果: " + matcher.matches());
            System.out.println("密码: " + password + ", 验证结果: " + validatePassword(password));
            System.out.println();
        }
    }
}
